#include <stdlib.h>
#include <unistd.h>

/* Novy datovy typ file_decriptor pro deskriptor souboru */
typedef int file_descriptor;

/* Funkce zapise LENGTH bytu z BUFFER do docasneho souboru.
 * Pote je jmeno souboru zruseno v filesystemu(unlink).
 * Vraci deskriptor souboru. */

file_descriptor write_tmp(char *buffer, size_t length)
{
  /* Vytvori nazev souboru a samotny soubor. XXXXXX bude
   * prepsano nejakymi znaky, aby bylo jmeno unikatni. */
  char temp_filename[] = "/tmp/temp_file.XXXXXX";
  int fd = mkstemp(temp_filename);
  /* Zrusi jmeno souboru v filesystemu, az se
   * uzavre deskriptor souboru soubor se smaze. */
  unlink(temp_filename);
  /* Zapise velikost zapisovanych dat v bytech. */
  write(fd, &length, sizeof(length));
  /* Nyni zapise samotna data. */
  write(fd, buffer, length);
  /* Vrati deskriptor souboru docasneho souboru */
  return(fd);
}

/* Precte data z docasneho souboru, jehoz deskriptor
 * souboru je ji predan jako 1. parametr(TEMP_FILE).
 * Vraci nove alokovany buffer s prectenymi daty, po
 * pouziti musi byt manualne dealokovany pomoci free().
 * Pomoci *LENGTH se vraci velikost bufferu v bytech.
 * Funkce nakonec uzavre deskriptor souboru a tim se
 * pri ukonceni souboru odstrani docasny soubor. */

char *read_tmp(file_descriptor temp_file, size_t *length)
{
  char *buffer;
  /* Vrati se na zacatek souboru. */
  lseek(temp_file, 0, SEEK_SET);
  /* Precte velikost zapsanych dat v souboru. */
  read(temp_file, length, sizeof(*length));
  /* Alokuje pamet pro buffer a cte data. */
  buffer = (char *) malloc (*length);
  read(temp_file, buffer, *length);
  /* Zavre deskriptor souboru */
  close(temp_file);
  return(buffer);
} 
